package com.qf.result;

import com.alibaba.fastjson.JSONObject;

import java.util.Map;

/**
 * created by 赵文韬 on 2022/5/27 14:36
 */
public class R {
    /**
     * 响应状态码
     */
    private int code;
    /**
     * 响应摘要信息
     */
    private String msg;
    /**
     * 响应报文携带的业务数据
     */
    private Object result;
    /**
     * 定义成功的代码
     */
    public static final int OK=200;
    /**
     * 定义成功的代码
     */
    public static final int OK_201=201;
    /**
     * 定义成功的代码
     */
    public static final int OK_202=202;
    /**
     * 定义错误的代码
     */
    public static final int ERROR=500;
    /**
     * 定义错误的代码
     */
    public static final int ERROR_501=501;
    /**
     * 定义错误的代码
     */
    public static final int ERROR_502=502;
    /**
     * 定义错误的代码
     */
    public static final int ERROR_503=503;
    /**
     * 定义错误的代码
     */
    public static final int ERROR_504=504;
    /**
     * 定义错误的代码
     */
    public static final int ERROR_505=505;

    /**
     * 请求失败的文本提示
     */
    public static final String ERROR_MSG="请求失败";

    /**
     * 请求成功的文本提示
     */
    public static final String OK_MSG="请求成功";

    /**
     * 判断响应是否成功的方法
     * 利用boolean类型的get/set的规定形式
     * 使得响应报文出现boolean类型的ok字段
     * @return 响应是否成功
     */
    public boolean isOk(){
        if(this.code/OK==1){
            return true;
        }
        return false;
    }

    /**
     * 以下是set方法
     * 要求set方法支持链式编程
     */
    public R setCode(int code) {
        this.code = code;
        return this;
    }

    public R setMsg(String msg) {
        this.msg = msg;
        return this;
    }

    public R setResult(Object result) {
        this.result = result;
        return this;
    }

    public R setResult(String key,Object value){
        if(result==null){
            JSONObject result=new JSONObject();
            result.put(key,value);
            this.result=result;
        }else{
            if(result instanceof JSONObject){
                ((JSONObject)result).put(key,value);
            }
            if(result instanceof Map){
                ((Map)result).put(key,value);
            }
        }
        return this;
    }

    /**
     * 以下是get方法
     * @return
     */
    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public Object getResult() {
        return result;
    }

    /**
     * 失败的方法
     */
    public static R error(){
        R r=new R().setCode(ERROR).setMsg(ERROR_MSG);
        return r;
    }

    public static R error(int code){
        return error().setCode(code);
    }
    public static R error(String msg){
        return error().setMsg(msg);
    }
    public static R error(int code,String msg){
        return error().setCode(code).setMsg(msg);
    }
    public static R error(Object data){
        return error().setResult(data);
    }


    /**
     * 成功的方法
     */
    public static R ok(){
        R r=new R().setCode(OK).setMsg(OK_MSG);
        return r;
    }
    public static R ok(int code){
        return ok().setCode(code);
    }
    public static R ok(String msg){
        return ok().setMsg(msg);
    }
    public static R ok(int code,String msg){
        return ok().setCode(code).setMsg(msg);
    }
    public static R ok(Object data){
        return ok().setResult(data);
    }


    /**
     * 把r对象转化为json的方法
     * @param r 待转化的对象
     * @return json字符串
     */
    public String toJsonString(R r){
        return JSONObject.toJSONString(r);
    }


}
